package com.ld.poetry.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.aop.SaveCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.dao.ResourcePathMapper;
import com.ld.poetry.entity.ResourcePath;
import com.ld.poetry.utils.PoetryUtil;
import com.ld.poetry.vo.ResourcePathVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 资源聚合里的图片，其他接口在ResourceAggregationController
 * </p>
 *
 * @author sara
 * @since 2021-09-14
 */
@RestController
@RequestMapping("/webInfo")
public class PictureController {

    @Autowired
    private ResourcePathMapper resourcePathMapper;

    /**
     * 查询管理员爱情照片列表
     * 
     * 功能说明：
     * 1. 获取管理员上传的所有已审核通过的爱情照片
     * 2. 按分类统计每个分类下的照片数量
     * 3. 返回分类及其对应的照片数量
     * 
     * 返回数据：
     * @return PoetryResult<List<Map<String, Object>>> 
     *   - 每个Map包含两个字段：
     *     - classify: 照片分类名称
     *     - count: 该分类下的照片数量
     * 
     * 数据结构示例：
     * [
     *   {
     *     "classify": "情侣照",
     *     "count": 5
     *   },
     *   {
     *     "classify": "婚纱照",
     *     "count": 3
     *   }
     * ]
     * 
     * 注意事项：
     * 1. 只返回管理员上传的照片（remark = 管理员ID）
     * 2. 只返回已审核通过的照片（status = true）
     * 3. 按分类进行分组统计
     * 4. 返回结果按分类名称排序
     */
    @GetMapping("/listAdminLovePhoto")
    public PoetryResult<List<Map<String, Object>>> listAdminLovePhoto() {
        // 创建查询条件构建器
        QueryWrapper<ResourcePath> queryWrapper = new QueryWrapper<>();
        
        // 设置查询条件：
        // 1. 选择需要查询的字段：分类名称和数量统计
        // 2. 只查询已审核通过的照片（status = true）
        // 3. 只查询管理员上传的照片（remark = 管理员ID）
        // 4. 只查询爱情照片类型的资源（type = 'lovePhoto'）
        // 5. 按分类名称进行分组
        queryWrapper.select("classify, count(*) as count")
                .eq("status", Boolean.TRUE)
                .eq("remark", PoetryUtil.getAdminUser().getId().toString())
                .eq("type", CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO)
                .groupBy("classify");
                
        // 执行查询并返回结果
        List<Map<String, Object>> maps = resourcePathMapper.selectMaps(queryWrapper);
        return PoetryResult.success(maps);
    }

    /**
     * 保存爱情照片
     * 
     * 功能说明：
     * 1. 保存新的爱情照片到数据库
     * 2. 需要用户登录权限
     * 3. 需要进行保存检查
     * 
     * 请求参数：
     * @param resourcePathVO 爱情照片信息对象，包含以下字段：
     *   - classify: 照片分类（必填）
     *   - cover: 照片封面图片（必填）
     *   - title: 照片标题（必填）
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     *   - 成功：返回成功信息
     *   - 失败：返回错误信息（如：信息不全）
     * 
     * 处理流程：
     * 1. 验证必填字段是否完整
     * 2. 创建新的爱情照片对象
     * 3. 设置照片属性：
     *    - type: 设置为爱情照片类型
     *    - status: 初始状态为未审核
     *    - remark: 记录上传用户ID
     * 4. 保存到数据库
     * 
     * 注意事项：
     * 1. 需要用户登录才能操作
     * 2. 所有必填字段不能为空
     * 3. 新添加的照片默认状态为未审核
     * 4. 照片需要管理员审核后才能显示
     * 5. 通过remark字段记录上传者ID，用于后续权限控制
     */
    @LoginCheck
    @SaveCheck
    @PostMapping("/saveLovePhoto")
    public PoetryResult saveLovePhoto(@RequestBody ResourcePathVO resourcePathVO) {
        // 验证必填字段是否完整
        if (!StringUtils.hasText(resourcePathVO.getClassify()) || !StringUtils.hasText(resourcePathVO.getCover()) ||
                !StringUtils.hasText(resourcePathVO.getTitle())) {
            return PoetryResult.fail("信息不全！");
        }

        // 创建新的爱情照片对象
        ResourcePath lovePhoto = new ResourcePath();
        
        // 设置照片属性
        lovePhoto.setClassify(resourcePathVO.getClassify());  // 设置照片分类
        lovePhoto.setTitle(resourcePathVO.getTitle());       // 设置照片标题
        lovePhoto.setCover(resourcePathVO.getCover());       // 设置照片封面
        lovePhoto.setRemark(PoetryUtil.getUserId().toString());  // 记录上传用户ID
        lovePhoto.setType(CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO);  // 设置类型为爱情照片
        lovePhoto.setStatus(Boolean.FALSE);                  // 设置初始状态为未审核

        // 保存到数据库
        resourcePathMapper.insert(lovePhoto);
        return PoetryResult.success();
    }
}
